// import package java.* / com/* by default
importPackage(Packages.ajaxjs);// Import our all packages.Beware of names conficts!

bf = {
	isDeug: null,
	java : {	
		/**
		 * JS Array 2 Java Array
		 * @param arr
		 * @returns {java.util.ArrayList}
		 */
		toArrayList: function (arr, isHashElemet){
			var java_arr = new java.util.ArrayList();
			for(var i = 0, j = arr.length; i < j; i++){
				if(isHashElemet){
					var java_hash = new java.util.HashMap();
					for(var js_hash in arr[i]){
						java_hash.put(js_hash, arr[i][js_hash]);
					}
					java_arr.add(java_hash);
				}else java_arr.add(arr[i]);
			}
			
			return java_arr;
		},
		toHashMap : function (keys, values){
			var java_hash = new java.util.HashMap();
			if(arguments.length == 1)
				for(var i in keys){
					java_hash.put(i, keys[i]);
				}
			else if(arguments.length > 1)
				for(var i = 0, j = keys.length; i < j; i++){
					java_hash.put(keys[i], values[i]);
				}
			
			return java_hash;
		}
	}
};

var jsEngine, // 保留一份 rhiono engine 
	request, urlMapping;

/**
 * 函数委托 参见 http://blog.csdn.net/zhangxin09/article/details/8508128
 * @return {Function}
*/
bf.Function_delegate = function () {
    var self = this, scope = this.scope, args = arguments, aLength = arguments.length, fnToken = 'function';

    return function(){
        var bLength = arguments.length, Length = (aLength > bLength) ? aLength : bLength;

        // mission one:
        for (var i = 0; i < Length; i++)
            if (arguments[i])args[i] = arguments[i]; // 拷贝参数

        args.length = Length; // 在 MS jscript下面，arguments作为数字来使用还是有问题，就是length不能自动更新。修正如左:

        // mission two:
        for (var i = 0, j = args.length; i < j; i++) {
            var _arg = args[i];
            if (_arg && typeof _arg == fnToken && _arg.late == true)
                args[i] = _arg.apply(scope || this, args);
        }

        return self.apply(scope || this, args);
    };
};
/**
 * 格式化字符串。
 * @param  {String} string 带标记的字符串，或者可变长度的字符串参数。
 * @param  {String} value1 第一个值，替换{0}。The value to replace token {0}
 * @param  {String} value2 第二个值，替换{1}...等等（可以有任意多个）。Etc...
 * @return {String} 转化过的字符串。The formatted string
 */

String.prototype.format = function () {
    var str = this; 
    if(arguments[0] instanceof java.lang.String || typeof(arguments[0]) == 'string'|| typeof(arguments[0]) == 'number'){
        for(var i = 0, j = arguments.length; i < j; i++)
//        	JAVA String 强转到 JS Str
            str = str.replace(new RegExp('\\{' + i +'\\}', 'g'), String(arguments[i]));
    }else{   
        for(var i in arguments[0])
            str = str.replace(new RegExp('\\{' + i +'\\}', 'g'), String(arguments[0][i])); // 大小写敏感
    }
    

    return str;
};

/**
 * 日期格式化。详见博客文章：http://blog.csdn.net/zhangxin09/archive/2011/01/01/6111294.aspx
 * e.g: new Date().format("yyyy-MM-dd hh:mm:ss")
 * @param 	{String} format
 * @return	{String}
*/
Date.prototype.format = function (format) {
    var $1, o = {
        "M+": this.getMonth() + 1,		// 月份，从0开始算
        "d+": this.getDate(),   		// 日期
        "h+": this.getHours(),   		// 小时
        "m+": this.getMinutes(), 		// 分钟
        "s+": this.getSeconds(), 		// 秒钟
								        // 季度 quarter
        "q+": Math.floor((this.getMonth() + 3) / 3),
        "S": this.getMilliseconds()	// 千秒
    };

    if (/(y+)/.test(format)) {
        $1 = RegExp.$1, 
        format = format.replace($1, String(this.getFullYear()).substr(4 - $1));
    }

    var value;
    for (var key in o) { // 如果没有指定该参数，则子字符串将延续到 stringvar 的最后。
        if (new RegExp("(" + key + ")").test(format)) {
            $1		= RegExp.$1,
	    	value	= String(o[key]),
	    	value	= $1.length == 1 ? value : ("00" + value).substr(value.length),
    		format	= format.replace($1, value);
        }
    }
    return format;
}

bf.initConfig = function(){
	var map = {};
		
	(function(obj, key){
		for(var i in obj){
			var value = obj[i];
			var _key = key + (key == '' ? i : '_' + i);
			if(typeof value == 'string'){
				map[_key] = value;
				// println(_key + ':' + map[_key])
			}else{ // it's object
				arguments.callee(value, _key);
			}
		}
	})(bf_Config, '');
 
	return bf.java.toHashMap(map);
}